# Python中__str__和__repr__方法的使用


class UserProfile:
    """用户信息类，用于展示__str__和__repr__方法的区别"""

    def __init__(self, username, age, email):
        self.username = username
        self.age = age
        self.email = email
        # 单个下划线(_)表示这是一个"受保护"的属性，按照约定不应从类外部直接访问
        # 但这只是一个命名约定，Python不会真正阻止访问，外部也可以访问和修改
        self._created_at = "2025-01-01"  # 模拟创建时间

    def __str__(self):
        """返回对用户友好的字符串表示
        主要用于print()函数和str()函数的输出
        """
        return f"用户 {self.username}，{self.age}岁"

    def __repr__(self):
        """返回详细的技术信息，主要用于调试
        返回一个包含所有重要属性的字典字符串
        """
        debug_info = {
            "username": self.username,
            "age": self.age,
            "email": self.email,
            "created_at": self._created_at,
            "object_type": self.__class__.__name__,
        }
        return str(debug_info)


# 创建用户实例
user = UserProfile("张三", 25, "zhangsan@example.com")

# 演示str方法（友好打印）
print("\n=== str方法演示（友好打印）===")
print(f"直接打印对象：{user}")
print(f"使用str()函数：{str(user)}")

# 演示repr方法（调试信息）
print("\n=== repr方法演示（调试信息）===")
print(f"使用repr()函数：{repr(user)}")

# 在列表中的表现，列表将对象包裹之后，打印时会自动调用repr方法
users = [user]
print("\n=== 在列表中的表现 ===")
print(f"列表默认使用repr：{users}")
